package mj.scott.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import mj.scott.common.exception.BusinessException;
import mj.scott.mapper.OrdersMapper;
import mj.scott.pojo.entity.Orders;
import mj.scott.service.IOrdersService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;

@Service
public class OrdersServiceImpl extends ServiceImpl<OrdersMapper, Orders> implements IOrdersService {

    /**
     * 分页查询订单
     */
    @Override
    public Page<Orders> getOrderPage(Integer page, Integer pageSize, Integer status, String tableNumber) {
        Page<Orders> pageInfo = new Page<>(page, pageSize);
        LambdaQueryWrapper<Orders> queryWrapper = new LambdaQueryWrapper<>();

        // 按状态筛选
        if (status != null) {
            queryWrapper.eq(Orders::getStatus, status);
        }
        // 按桌号筛选
        if (tableNumber != null && !tableNumber.isEmpty()) {
            queryWrapper.like(Orders::getTableNumber, tableNumber);
        }
        // 按订单时间倒序（最新的在前）
        queryWrapper.orderByDesc(Orders::getOrderTime);

        return this.page(pageInfo, queryWrapper);
    }

    /**
     * 取消订单（仅允许取消"准备中"或"待付款"状态）
     */
    @Override
    @Transactional
    public void cancelOrder(Long id) {
        Orders orders = this.getById(id);
        if (orders == null) {
            throw new BusinessException("订单不存在");
        }

        // 校验状态：只有1-准备中、3-待付款可以取消
        Integer currentStatus = orders.getStatus();
        if (currentStatus != 1 && currentStatus != 3) {
            throw new BusinessException("当前订单状态不允许取消（仅准备中/待付款可取消）");
        }

        // 更新为"取消"（这里用状态5-退款，也可新增状态6-取消，根据业务调整）
        orders.setStatus(5);
        orders.setCheckoutTime(LocalDateTime.now()); // 记录取消时间
        this.updateById(orders);
    }

    /**
     * 更新订单状态（校验状态流转合法性）
     */
    @Override
    @Transactional
    public void updateOrderStatus(Long id, Integer status) {
        // 校验目标状态合法性
        if (status < 1 || status > 5) {
            throw new BusinessException("无效的订单状态（1-5）");
        }

        Orders orders = this.getById(id);
        if (orders == null) {
            throw new BusinessException("订单不存在");
        }

        // 简单校验状态流转（示例：准备中→已上菜→待付款→已付款）
        Integer currentStatus = orders.getStatus();
        if (status < currentStatus && !(currentStatus == 3 && status == 5)) { // 允许待付款→取消（5）
            throw new BusinessException("订单状态流转不合法（当前：" + currentStatus + "，目标：" + status + "）");
        }

        orders.setStatus(status);
        // 如果是"已上菜"，记录时间；如果是"已付款/退款"，记录结账时间
        if (status == 2) {
            orders.setCheckoutTime(LocalDateTime.now());
        }
        this.updateById(orders);
    }

    /**
     * 更新支付状态
     */
    @Override
    @Transactional
    public void updatePayStatus(Long id, Integer payStatus) {
        // 校验支付状态合法性
        if (payStatus < 0 || payStatus > 2) {
            throw new BusinessException("无效的支付状态（0-2）");
        }

        Orders orders = this.getById(id);
        if (orders == null) {
            throw new BusinessException("订单不存在");
        }

        orders.setPayStatus(payStatus.byteValue());
        // 已支付时同步更新订单状态为"已付款"（状态4）
        if (payStatus == 1) {
            orders.setStatus(4);
            orders.setCheckoutTime(LocalDateTime.now());
        }
        // 退款时同步更新订单状态为"退款"（状态5）
        if (payStatus == 2) {
            orders.setStatus(5);
            orders.setCheckoutTime(LocalDateTime.now());
        }
        this.updateById(orders);
    }
}